// LeetCode 主站 Problem Nr. 200: 岛屿数量

/*
给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。
岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外，你可以假设该网格的四条边均被水包围。

示例 1：
	输入：grid = [
  		["1","1","1","1","0"],
  		["1","1","0","1","0"],
  		["1","1","0","0","0"],
		["0","0","0","0","0"]
	]
	输出：1
示例 2：
	输入：grid = [
  		["1","1","0","0","0"],
  		["1","1","0","0","0"],
  		["0","0","1","0","0"],
  		["0","0","0","1","1"]
	]
输出：3

提示：
	m == grid.length
	n == grid[i].length
	1 <= m, n <= 300
	grid[i][j] 的值为 '0' 或 '1'

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

package main

func numIslands(grid [][]byte) int {
	return method1(grid)
}

func method1(grid [][]byte) int {
	if grid == nil || len(grid) == 0 {
		return 0
	}

	result := 0
	for i := range grid {
		for j := range grid[i] {
			if grid[i][j] == '1' {
				result++
				dfs(grid, i, j)
			} 
		}
	}

	return result
}

func dfs(grid [][]byte, i int, j int) {
	if i < 0 || i >= len(grid) || j < 0 || j >= len(grid[0]) || grid[i][j] == '0' {
		return
	}

	grid[i][j] = '0'
	dfs(grid, i-1, j)
	dfs(grid, i+1, j)
	dfs(grid, i, j+1)
	dfs(grid, i, j-1)
}
